package savet.util;

import java.util.LinkedList;
import java.util.List;
import savet.entidades.Empregador;
import savet.entidades.Trabalhador;

/**
 *
 * Classe que contem a lista de trabalhadores para manipulacao no aplicativo.
 *
 * @author Adisson
 */
public class ListaTrabalhadores extends savet.util.Observable {

    private static ListaTrabalhadores instance = null;
    private List<Trabalhador> trabalhadores;

    private ListaTrabalhadores() {
        trabalhadores = new LinkedList<Trabalhador>();
    }

    public static ListaTrabalhadores getInstance() {
        if (instance == null) {
            instance = new ListaTrabalhadores();
        }
        return instance;
    }

    @Override
    public boolean adicionarObserver(Observer o) {
        boolean add = super.adicionarObserver(o);
        for (Trabalhador trabalhador : trabalhadores) {
            o.elementoAdicionado(trabalhador);
        }
        return add;
    }

    public boolean adicionarTrabalhador(Trabalhador trabalhador) {
        boolean add = trabalhadores.add(trabalhador);
        notificarAdicaoTrabalhador(trabalhador);
        return add;
    }

    public void removerTrabalhadores(List<Trabalhador> trabalhadores) {
        for (Trabalhador t : trabalhadores) {
            removerTrabalhador(t);
        }
    }

    public boolean removerTrabalhador(Trabalhador trabalhador) {
        boolean remove = trabalhadores.remove(trabalhador);
        if (remove) {
            notificarRemocaoTrabalhador(trabalhador);
        }
        return remove;
    }

    public boolean removerTrabalhador(int index) {
        try {
            return removerTrabalhador(trabalhadores.get(index));
        } catch (IndexOutOfBoundsException e) {
            return false;
        }
    }

    public boolean contemTrabalhador(Trabalhador trabalhador) {
        return trabalhadores.contains(trabalhador);
    }

    public Trabalhador getTrabalhador(int index) {
        return trabalhadores.get(index);
    }

    public void atualizarTrabalhadores(List<Trabalhador> trabalhadores) {
        this.trabalhadores.clear();
        this.trabalhadores.addAll(trabalhadores);
        Empregador empregadorAtual = LoteUtil.getInstance().getEmpregadorAtual();
        if (empregadorAtual != null) {
            empregadorAtual.setTrabalhadores(this.trabalhadores);
        }
    }

    public void setTrabalhadores(List<Trabalhador> trabalhadores) {
        this.trabalhadores = trabalhadores;
    }

    public List<Trabalhador> getTrabalhadores() {
        return trabalhadores;
    }
}
